#include "vec2f.h"

//
// toZero
//
void vec2f::toZero() {
	this->x = 0.0f;
	this->y = 0.0f;
};

//
//	Inverse
//
vec2f vec2f::inverse() const {
	return vec2f(-x, -y);
}

//
//	LengthSquared - useful if we want to avoid expensive sqrt()
//
float vec2f::lengthSquared() const {
	return (x * x) + (y * y);
};

//
//	Length - Vector magnitude
//
float vec2f::length() const {
	if(lengthSquared() == 0) { return 0; }
	return sqrt(lengthSquared());
};





//
//	Dot product
//
static vec2f dot(const vec2f &a, const vec2f &b) {
	return vec2f((a.x + b.x), (a.y + b.y));
};





//
//	Inverse operator
//
inline vec2f vec2f::operator-() const {
	return vec2f(-x, -y);
};

//
//	Comparison operator
//
inline bool vec2f::operator==(const vec2f &src) const {
	return ((x == src.x) && (y == src.y)) ? true : false;
};
inline bool vec2f::operator!=(const vec2f &src) const {
	return ((x == src.x) && (y == src.y)) ? false : true;
};

//
//	Vector Addition
//
inline vec2f vec2f::operator+(const vec2f &src) const {
	return vec2f( (this->x + src.x), (this->y + src.y) );
};

//
//	Vector Subtraction
//
inline vec2f vec2f::operator-(const vec2f &src) const {
	return vec2f( (this->x - src.x), (this->y - src.y) );
};

//
//	Vector multiplication
//
inline vec2f vec2f::operator*(const vec2f &src) const {
	return vec2f((x * src.x), (y * src.y));
};

//
//	Vector division
//
inline vec2f vec2f::operator/(const vec2f &src) const {
	return vec2f((x / src.x), (y / src.y));
};

//
//	Vector add-equals +=
//
inline void vec2f::operator+=(const vec2f &src) {
	this->x += src.x;
	this->y += src.y;
};

//
//	Vector subtract-equals -=
//
inline void vec2f::operator-=(const vec2f &src) {
	this->x -= src.x;
	this->y -= src.y;
};

//
//	Vector multiply-equals *=
//
inline void vec2f::operator*=(const vec2f &src) {
	this->x *= src.x;
	this->y *= src.y;
};

//
//	Vector divide-equals
//
inline void vec2f::operator/=(const vec2f &src) {
	this->x /= src.x;
	this->y /= src.y;
};





//
//	Scalar addition
//
inline vec2f vec2f::operator+(const float a) const {
	return vec2f((x + a), (y + a));
};

//
//	Scalar subtraction
//
inline vec2f vec2f::operator-(const float a) const {
	return vec2f((x - a), (y - a));
};

//
//	Scalar multiplication
//
inline vec2f vec2f::operator*(const float a) const {
	return vec2f((x * a), (y * a));
};

//
//	Scalar division
//
inline vec2f vec2f::operator/(const float a) const {
	return vec2f((x / a), (y / a));
};